package day23.collection;

import java.util.*;

class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

public class ComparatorTest {
    public static void main(String[] args) {
        // 创建Person列表
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 35));
        people.add(new Person("David", 20));
        people.add(new Person("Eve", 25));
        
        System.out.println("原始列表:");
        people.forEach(System.out::println);
        
        // 使用Lambda表达式按年龄排序
        // Lambda表达式(p1, p2) -> Integer.compare(p1.getAge(), p2.getAge())实现Comparator接口
        // 比较逻辑：如果p1年龄小于p2年龄返回负数，等于返回0，大于返回正数
        System.out.println("\n按年龄排序 (Lambda表达式):");
        people.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));
        people.forEach(System.out::println);
        
        // 使用Comparator.comparing按姓名排序
        // Comparator.comparing接收一个函数式接口，提取比较的键值(这里是姓名)
        // 然后按照自然顺序进行排序
        System.out.println("\n按姓名排序 (Comparator.comparing):");
        people.sort(Comparator.comparing(Person::getName));
        people.forEach(System.out::println);
        
        // 按年龄排序，然后按姓名排序
        // 使用thenComparing方法实现多重排序
        // 首先按年龄排序，年龄相同时再按姓名排序
        System.out.println("\n按年龄排序，然后按姓名排序:");
        people.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
        people.forEach(System.out::println);
        
        // 逆序排序
        // 使用reversed()方法将比较结果反转，实现降序排列
        System.out.println("\n按姓名逆序排序:");
        people.sort(Comparator.comparing(Person::getName).reversed());
        people.forEach(System.out::println);
        
        // 使用自定义Comparator类
        // 通过实现Comparator接口创建自定义比较逻辑
        System.out.println("\n使用自定义Comparator类按年龄排序:");
        people.sort(new AgeComparator());
        people.forEach(System.out::println);
        
        // 测试数组排序
        // Arrays.sort方法也可以接受Comparator参数对数组进行排序
        String[] names = {"Alice", "Bob", "Charlie", "David", "Eve"};
        System.out.println("\n字符串数组排序前:");
        System.out.println(Arrays.toString(names));
        
        // 按字符串长度排序
        Arrays.sort(names, Comparator.comparing(String::length));
        System.out.println("\n字符串数组按长度排序后:");
        System.out.println(Arrays.toString(names));
        
        // TreeSet使用自定义比较器
        // TreeSet是有序集合，可以在构造时传入Comparator定义排序规则
        // 这里按照Person的年龄进行排序
        System.out.println("\nTreeSet使用自定义比较器 (按年龄):");
        TreeSet<Person> sortedPeople = new TreeSet<>(Comparator.comparing(Person::getAge));
        people.forEach(p -> sortedPeople.add(p));
        sortedPeople.forEach(System.out::println);
    }
    
    // 自定义比较器类
    // 实现Comparator接口，重写compare方法定义比较逻辑
    static class AgeComparator implements Comparator<Person> {
        @Override
        public int compare(Person p1, Person p2) {
            // 返回年龄差值，实现按年龄升序排序
            return Integer.compare(p1.getAge(), p2.getAge());
        }
    }
}